/**
 * Tencent is pleased to support the open source community by making polaris-go available.
 *
 * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software distributed
 * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

package model

import (
	"time"
)

// TaskValue 任务值类型
type TaskValue interface {
	// 比较两个元素
	CompareTo(interface{}) int
	// 删除前进行检查，返回true才删除，该检查是同步操作
	EnsureDeleted(value interface{}) bool
}

// TaskValues 定时任务处理的数据
type TaskValues interface {
	// 获取启动状态
	Started() bool
	// 增加数据
	// 对于非立即启动的任务，首次增加value时，协程才开始启动
	AddValue(key interface{}, value TaskValue)
	// 删除数据
	// 当缓存数据列表为空时，对于非长稳运行的任务，则会结束协程
	DeleteValue(key interface{}, value TaskValue)
}

// 任务处理结果
type TaskResult int

const (
	// CONTINUE 本次任务处理完毕，更新时间戳并等待下一轮
	CONTINUE TaskResult = iota
	// SKIP 本次任务无需执行，不更新时间戳
	SKIP
	// TERMINATE 后续任务无需再执行
	TERMINATE
)

type TaskEvent int

const (
	// EventStart 任务启动事件
	EventStart TaskEvent = iota
	// EventStop 任务停止事件
	EventStop
)

// PeriodicCallBack 回调接口
type PeriodicCallBack interface {
	// 任务回调函数
	// 参数说明：
	// lastProcessTime：上一次任务处理时间
	// taskKey：任务数据主键
	// taskValue: 任务数据值
	// 返回值：
	// TaskResult：后续是否继续执行，本次是否忽略
	Process(taskKey interface{}, taskValue interface{}, lastProcessTime time.Time) TaskResult
	// OnTaskEvent 任务事件回调
	OnTaskEvent(event TaskEvent)
}

// PeriodicTask 周期执行的任务信息（含高优先级任务)
type PeriodicTask struct {
	// 任务标识
	Name string
	// 定时任务回调
	CallBack PeriodicCallBack
	// 是否需要处理高优先级任务
	TakePriority bool
	// 是否长稳运行
	LongRun bool
	// 调度周期
	Period time.Duration
	// 是否延迟启动，为true的话，则会延迟一个周期再执行第一次任务
	DelayStart bool
}

// PriorityCallBack 调度高优先级任务
type PriorityCallBack interface {
	// 处理任务内容
	Process()
}

// PriorityTask 任务结构
type PriorityTask struct {
	// 任务标识
	Name string
	// 任务执行回调函数
	CallBack PriorityCallBack
}
